//  loadsh  就是一个封装所有纯函数的包

// 好处 1. 可缓存 2. 可测试  3. 并行处理

// 副作用  如果函数依赖外部的状态的话，无法保证输出相同，就会带来副作用

 
// 函数柯里化   当一个函数有多个参数时，先传递一部分参数(这部分参数永远不变)，然后返回一个新的函数接收剩余的参数，返回结果

// function checkAge (age) {
//   return function(min) {
//     return age >= min
//   }
// } 

// es6
let checkAge = (min) => (age =>  age >= min)

let checkAge18 = checkAge(18)
// console.log(checkAge18(20))
// console.log(checkAge18(17))

// 函数的组合，将多个函数组合生成一个新的函数 ,避免洋葱函数，即一层嵌套一层
// 函数组合的结合律，即前几个函数组合或者后几个函数组合，他们返回的结果是一样的 
// const f = _.flow(_.flow(_.reverse, _.first), _.toUpper)
// const f = _.flow(_.reverse, _.flow(_.first, _.toUpper))


function compose(f, g) {
  return function(value) {
    return f(g(value))
  }
}
 
function reverse(array) {
  return array.reverse()
}

function first (array) {
  return array[0]
}

let last = compose(first, reverse)
console.log(last([1,2,3,4,5]))


// lodash-fp 模块
// pointFree模式，把抽象出来的函数再合成一个函数

